package com.kinggm.base;

import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import javax.sql.DataSource;
import java.util.HashMap;


/**
 * 实现动态数据源切换
 *
 * 添加 @Primary注解 Spring使用DynamicDataSource 作为
 *
 */

@Component
@Primary
public class DynamicDataSource extends AbstractRoutingDataSource {


    // 用于存储当前线程数据源名称
    public static ThreadLocal<String> dataSourceName = new ThreadLocal<>();


    // 注入数据源1
    @Resource
    private DataSource dataSourceOne;

    // 注入数据源2
    @Resource
    private DataSource dataSourceTwo;


    @Override
    protected Object determineCurrentLookupKey() {
        // 返回当前数据源名称
        return dataSourceName.get();
    }


    @Override
    public void afterPropertiesSet() {
        // 设置所有数据源
        HashMap<Object, Object> targetDataSource = new HashMap<>();
        targetDataSource.put("dataSourceOne", dataSourceOne);
        targetDataSource.put("dataSourceTwo", dataSourceTwo);
        super.setTargetDataSources(targetDataSource);

        // 设置默认数据源
        super.setDefaultTargetDataSource(dataSourceOne);

        // 父类方法
        super.afterPropertiesSet();
    }
}
